/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.seguridad.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.seguridad.bean.Menu;
import sv.com.intesal.seguridad.bean.TipoMenu;
import sv.com.intesal.seguridad.sql.SQLMenu;

/**
 *
 * @author ejerez
 */
public class MenuControlador {

    public Menu getMenu(Integer codigo_m) throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLMenu.getMenu_x_Codigo);
            ps.setInt(1, codigo_m);
            ResultSet rs = ps.executeQuery();

            Menu m = new Menu();
            while (rs.next()) {
                m.setCodigo_m(rs.getInt("codigo_m"));
                m.setCodigo_papa_m(rs.getInt("codigo_papa_m"));
                m.setNombre_m(rs.getString("nombre_m"));
                m.setDescripcion_m(rs.getString("descripcion_m"));
                m.setUrl_m(rs.getString("url_m"));
                m.setNivel_m(rs.getInt("nivel_m"));
                m.setOrdenar_m(rs.getInt("ordenar_m"));
                m.setEspecial_m(rs.getString("especial_m"));
                m.setEstado_m(rs.getString("estado_m"));

                m.setFiltro_estado_m(true);
                if (m.getEstado_m().equals("A")) {
                    m.setFiltro_estado_m(false);
                }

                m.setFiltro_especial_m(false);
                if (m.getEspecial_m().equals("S")) {
                    m.setFiltro_estado_m(true);
                }
                TipoMenu tm = new TipoMenu();
                tm.setCodigo_tm(rs.getInt("codigo_tm"));
                tm.setNombre_tm(rs.getString("nombre_tm"));
                m.setTipoMenu(tm);
            }
            return m;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validar_hijo() throws Exception {
        /*
        Si hay hijos entonces es un menu papa, sino hay hijos es el ultimo nivel del menu
         */
        try {
            return false;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Menu> fillGrid() throws Exception {
        List<Menu> lista = new ArrayList<Menu>();

        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLMenu.getMenus).executeQuery();

            while (rs.next()) {

                Menu m = new Menu();
                m.setCodigo_m(rs.getInt("codigo_m"));
                m.setCodigo_papa_m(rs.getInt("codigo_papa_m"));
                m.setNombre_m(rs.getString("nombre_m"));
                m.setDescripcion_m(rs.getString("descripcion_m"));
                m.setUrl_m(rs.getString("url_m"));
                m.setNivel_m(rs.getInt("nivel_m"));
                m.setOrdenar_m(rs.getInt("ordenar_m"));
                m.setEspecial_m(rs.getString("especial_m"));
                m.setEstado_m(rs.getString("estado_m"));

                m.setFiltro_estado_m(true);
                if (m.getEstado_m().equals("A")) {
                    m.setFiltro_estado_m(false);
                }

                m.setFiltro_especial_m(false);
                if (m.getEspecial_m().equals("S")) {
                    m.setFiltro_especial_m(true);
                }
                TipoMenu tm = new TipoMenu();
                tm.setCodigo_tm(rs.getInt("codigo_tm"));
                tm.setNombre_tm(rs.getString("nombre_tm"));
                m.setTipoMenu(tm);
                lista.add(m);
            }
            rs.close();
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }

    }

    public void completeTransaction(Menu m) throws Exception {

        try {
            PreparedStatement ps = null;
            if (m.getCodigo_m() == null) {
                ps = cConexion.conectar().prepareStatement(SQLMenu.insert);
            } else {
                ps = cConexion.conectar().prepareStatement(SQLMenu.update);
                ps.setInt(10, m.getCodigo_m());
            }

            ps.setInt(1, m.getTipoMenu().getCodigo_tm());
            ps.setInt(2, m.getCodigo_papa_m());
            ps.setString(3, m.getNombre_m());
            ps.setInt(4, m.getNivel_m());
            ps.setInt(5, m.getOrdenar_m());
            ps.setString(8, m.getUrl_m());
            ps.setString(9, m.getDescripcion_m());

            if (m.getFiltro_especial_m() == true) {
                ps.setString(6, "S");
            } else {
                ps.setString(6, "N");
            }
            if (m.getFiltro_estado_m() == false) {
                ps.setString(7, "A");
            } else {
                ps.setString(7, "I");
            }
            ps.executeUpdate();


            this.updateOrdenarMenu();

            MenuUsuarioControlador mu = new MenuUsuarioControlador();
            mu.inserMenuUsuario();

            PerfilMenuControlador pm = new PerfilMenuControlador();
            pm.inserPerfilMenu();

            Mensaje men = new Mensaje();
            if (m.getCodigo_m() == null) {
                men.messageInfo(men.getIinformation());
            } else {
                men.messageInfo(men.getImodificada());
            }

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private void updateOrdenarMenu() throws Exception {
        try {

            Connection cnn = null;
            PreparedStatement ps = null;
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLMenu.updateOrdenarMenuAll);
            ps.executeUpdate();

            ps.close();
            this.updateOrdenarMenu_x_Nivel();

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private void updateOrdenarMenu_x_Nivel() throws Exception {
        try {
            for (int i = 2; i < 10; i++) {
                Connection cnn = null;
                cnn = cConexion.conectar();
                PreparedStatement ps = null;
                ps = cnn.prepareStatement(SQLMenu.updateOrdenarMenu_x_Nivel);
                ps.setInt(1, i);
                ps.executeUpdate();
                ps.close();
                cnn.close();
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}